package 反射;

import javax.management.DescriptorAccess;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class 获取成员方法 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取类的字节码文件
        Class<?> aClass = Class.forName("反射.Student");

        //getMethods获取所有公共的成员方法(包含从父类继承的公共成员方法)
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        //获取本类的所有方法(但是不能获取到父类中的方法)
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }

        //获取指定的成员方法
        Method eat = aClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);

        //获取方法的修饰符
        int modifiers = eat.getModifiers();

        //获取方法的名字
        String name = eat.getName();
        System.out.println(name);

        //获取方法的形参
        Parameter[] parameters = eat.getParameters();

        //获取到方法抛出的异常,并且放进数组中
        Class<?>[] exceptionTypes = eat.getExceptionTypes();

        //运行方法
        /* Method类中用于创建对象的方法
        object invoke(object,obj,object.....):
        参数一:表示方法的调用的对象
        参数二:调用这个方法要传递的参数(没有就不写)
        方法的返回值:相同的接受,没有就不进行接受
         */
        //创建一个方法调用的对象
        Student stu =new Student("张三",23);
        eat.invoke(stu,"蔬菜");

    }
}
